其他
为何优先选用unique_ptr而不是裸指针?
前言
在此之前,先回答读者的一个提问:C语言中该怎么办?有几点建议:
编写时尽量遵循函数内申请,函数内释放的原则 注意成对编写malloc和free 使用静态扫描工具,如《pclint检查》 使用内存检测工具,如valgrind
unique_ptr
基本使用
up = std::unique_ptr<int>(new int(12));
std::unique_ptr<string> up1(new string("bianchengzhuji"));
std::unique_ptr<int[]> up2(new int[10]);//数组需要特别注意
int *p= new int(1111);
up.reset(p);//令up指向新的对象,p为内置指针
#include<iostream>
#include<unistd.h>
#include<memory>
void myClose(int *fd)
{
close(*fd);
}
int main()
{
int socketFd = 10;//just for example
std::unique_ptr<int,decltype(myClose)*> up(&socketFd,myClose);
/*下面是另外两种写法,后面一种是使用lambda表达式*/
//std::unique_ptr<int,void(*)(int*)> up(&socketFd,myClose);
//std::unique_ptr<int,void(*)(int*)> ip(&socketFd,[](int *fd){close(*fd);});
return 0;
}
std::unique_ptr<T,D> up(d);//空的unique_ptr
T unique_ptr管理的对象类型 D 删除器类型 t unique_ptr管理的对象 d 删除器函数/function对象等,用于释放对象指针
释放指向的对象
up.release();//放弃控制权,返回裸指针,并将up置为空
up.reset();//释放up指向的对象
unique_ptr不支持普通的拷贝和赋值
std::unique_ptr<int> up1(new int(1111));
up0 = up1 //错误,不可赋值
std::unique_ptr<int> up2(up1);//错误,不支持拷贝
移动unique_ptr的对象
std::unique_ptr<int> up2(up1.release());
std::unique_ptr<int> up2;
up2.reset(up1.release());
std::unique_ptr<int> up2(std::move(up1));
在函数中的使用
作为参数
#include<iostream>
#include<memory>
void test(std::unique_ptr<int> p)
{
*p = 10;
}
int main()
{
std::unique_ptr<int> up(new int(42));
test(up);//试图传入unique_ptr,编译报错
std::cout<<*up<<std::endl;
return 0;
}
#include<iostream>
#include<memory>
void test(int *p)
{
*p = 10;
}
int main()
{
std::unique_ptr<int> up(new int(42));
test(up.get());//传入裸指针作为参数
std::cout<<*up<<std::endl;//输出10
return 0;
}
#include<iostream>
#include<memory>
void test(std::unique_ptr<int> &p)
{
*p = 10;
}
int main()
{
std::unique_ptr<int> up(new int(42));
test(up);
std::cout<<*up<<std::endl;//输出10
return 0;
}
#include<iostream>
#include<memory>
void test(std::unique_ptr<int> p)
{
*p = 10;
}
int main()
{
std::unique_ptr<int> up(new int(42));
test(std::unique_ptr<int>(up.release()));
//test(std::move(up));//这种方式也可以
return 0;
}
作为返回值
#include<iostream>
#include<memory>
std::unique_ptr<int> test(int i)
{
return std::unique_ptr<int>(new int(i));
}
int main()
{
std::unique_ptr<int> up = test(10);
//std::shared_ptr<int> up = test(10);
std::cout<<*up<<std::endl;
return 0;
}
为什么优先选用unique_ptr
避免内存泄露 避免更大开销
/*do something*/
delete p;